package Serialization;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

import org.jdom.*;
import org.jdom.input.*;
import org.jdom.output.*;

import Serveur.Serveur;
import Transports.Avion;
import Transports.Bateau;
import Transports.Bus;
import Transports.Train;
import Transports.Transports;
import Transports.TypeTransport;

public class TransportXML {

	private Serveur serv;

	private static Element racine;	
	private static org.jdom.Document document;

	/**
	 * Constructeur créeant la racine et le document xml.
	 */
	public TransportXML(Serveur serv)
	{
		this.serv=serv;
		racine = new Element("Transport");	
		document = new Document(racine);
	}

	/**
	 * méthode pour enregistrer le fichier xml	
	 * @param document
	 * @param fichier
	 */

	public void enregistre(Document document, String fichier)
	{	
		try
		{

			XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat());

			sortie.output(document, new FileOutputStream(fichier));
		}
		catch (java.io.IOException e){}
	}

	/**
	 * méthode pour lire les fichiers xml 
	 * @param fichier
	 * @throws Exception
	 */


	public void lireFichier(String fichier) throws Exception
	{
		SAXBuilder sxb = new SAXBuilder();
		document = sxb.build(new File(fichier));
		racine = document.getRootElement();
	}
	/**
	 * Permet de créer le fichié xml des transports à partir de la liste du serveur
	 * @param Transport transport
	 */
	public void XmlTransport(Transports transport)
	{
		try{
			Element transport1 = new Element("Transport"+transport.getIdTransport());
			racine.addContent(transport1);

			Element idTransport = new Element("IdTransport");
			idTransport.setText(transport.getIdTransport()+"");
			transport1.addContent(idTransport);
			Element capacite = new Element("Capacite");
			capacite.setText(transport.getCapacite()+"");
			transport1.addContent(capacite);
			Element prixBillet = new Element("PrixBilletDepart");
			prixBillet.setText(transport.getPrixBillet()+"");
			transport1.addContent(prixBillet);
			Element typeTransport = new Element ("TypeTransport");
			typeTransport.setText(transport.getTypeDuTransport().toString());	
			transport1.addContent(typeTransport);

			enregistre(document,"Transport.xml");
		}
		catch(Exception e){};
	}
	public void XmlTransport(ArrayList<Transports> listeTransport)
	{
		clearXml();
		for(int i =0; i<listeTransport.size();i++)
		{
			XmlTransport(listeTransport.get(i));
		}
	}
	
	/**
	 * Supprimer les elements pre-existants du xml
	 */
	public void clearXml(){
		List listElements = racine.getChildren();
		ArrayList<Element> elements = new ArrayList<Element>();
		for (int i = 0; i<listElements.size(); i++)
		{
			//Element temp = (Element) listElements.get(i);
			elements.add((Element) listElements.get(i));
			//racine.removeChild(temp.getName());
		}
		for(Element aSupprimer : elements){
			racine.removeChild(aSupprimer.getName());
		}		
	}
	
	public ArrayList<Transports> creatTransport()
	{
		try {
			this.lireFichier("Transport.xml");
			List listTransport = racine.getChildren();
			ArrayList<Transports> listeTransport = new ArrayList<Transports> ();
			for (int i = 0; i<listTransport.size(); i++)
			{
				Element temp = (Element) listTransport.get(i);

				Integer idTransport = Integer.parseInt(temp.getChild("IdTransport").getText());

				Integer capacite = Integer.parseInt(temp.getChild("Capacite").getText());

				Double prixBillet = Double.parseDouble(temp.getChild("PrixBilletDepart").getText());

				TypeTransport typeTransport = TypeTransport.toProfil(temp.getChild("TypeTransport").getText());

				Transports transportTemp = null;

				if(typeTransport.equals(TypeTransport.AVION))
				{
					transportTemp = new Avion(serv,idTransport,prixBillet,capacite);	
				}
				if(typeTransport.equals(TypeTransport.BUS))
				{
					transportTemp = new Bus(serv,idTransport,prixBillet,capacite);				
				}
				if(typeTransport.equals(TypeTransport.TRAIN))
				{
					transportTemp = new Train(serv,idTransport,prixBillet,capacite);				
				}
				if(typeTransport.equals(TypeTransport.BATEAU))
				{
					transportTemp = new Bateau(serv,idTransport,prixBillet,capacite);				
				}
				listeTransport.add(transportTemp);
			}

			return listeTransport;
		}
		catch(Exception e){ System.out.println("pb1");return null;}
	}
}

